package aspects;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import validacion.Validador;

public aspect ValidadorAspect {

	HashMap<Object, HashMap<String, List<Validador<?>>>> objetosMonitoreados = new HashMap<>();  // CAMBIOS!

	pointcut asignacion(Object objeto, Object valorVariable):
		set (@Monitored * dominio.*.*) && target(objeto) && args(valorVariable);  // CAMBIOS!

	before(Object objeto, Object valorAAsignar): asignacion(objeto,valorAAsignar) {  // CAMBIOS!

		String nombreVariable = thisJoinPoint.getSignature().getName();

		if (objetosMonitoreados.containsKey(objeto) 
				&& objetosMonitoreados.get(objeto).containsKey(nombreVariable)) {

			for (Validador<?> validador : objetosMonitoreados.get(objeto).get(nombreVariable)) {  // CAMBIOS!
					validador.validar(valorAAsignar);
			}

		}
	}

	public void agregarValidador(Object objeto, String nombreVariable,
			Validador<?> validador) {

		if (!objetosMonitoreados.containsKey(objeto)) {     // CAMBIOS!

			objetosMonitoreados
					.put(objeto, new HashMap<String, List<Validador<?>>>());
		}

		if (!objetosMonitoreados.get(objeto).containsKey(nombreVariable)) {  // CAMBIOS!

			objetosMonitoreados.get(objeto).put(nombreVariable,
					new ArrayList<Validador<?>>());
		}

		objetosMonitoreados.get(objeto).get(nombreVariable).add(validador);

	}
}